# --------------------click点击-----------------------
# 最常见的操作之一，使用 WebElement 对象的 click 方法， 示例代码就讲过，不再赘述
#
# --------------------tap点按-------------------------
# WebElement 对象的 tap 方法和 click 类似，都是点击界面。
# 但是最大的区别是， tap是 针对坐标而不是针对找到的元素。
# 为了保证自动化代码在所有分辨率的手机上都能正常执行，我们通常应该使用click方法。
# 但有的时候，我们难以用通常的方法定位元素， 可以用这个tap方法，根据坐标来点击
# 既然tap是用坐标来点击界面的，我们怎么知道这个元素的坐标呢？大家还记得用inspect 查看该元素的属性中，有一个 bounds 属性吗？
# 它就是表示元素的左上角，右下角坐标的 坐标。
# 我们还可以使用 UIAutomatorviewer 直接光标移动，看右边的属性提示。
# tap 方法可以像这样进行调用
# driver.tap([(850,1080)],300)
# 它有两个参数：
# 第一个参数是个列表，表示点击的坐标。
# 注意最多可以有5个元素，代表5根手指点击5个坐标。所以是list类型。
# 如果我们只要模拟一根手指点击屏幕，list中只要一个元素就可以了
# 第二个参数 表示 tap点按屏幕后 停留的时间。
# 如果点按时间过长，就变成了长按操作了。

# -----------------------输入-----------------------------
# 最常见的操作之一， 使用 WebElement 对象的 send_keys 方法， 示例代码就讲过，不再赘述

# ----------------------获取界面文本信息--------------------
# 可以通过 WebElement 对象的 .text 属性获取该对象的文本信息，示例代码就讲过，不再赘述

# -----------------------滑动----------------------------
# 我们做移动app测试的时候，经常需要滑动界面。
# 怎么模拟滑动呢？ WebDriver对象的 swipe方法，就提供了这个功能
# 比如
# driver.swipe(start_x=x, start_y=y1, end_x=x, end_y=y2, duration=800)
# 前面4个参数是滑动起点和终点 的x、y坐标。
# 第5个参数 duration是滑动从起点到终点坐标所耗费的时间。
# 注意这个时间非常重要，在屏幕上滑动同样的距离，如果时间设置的很短，就是快速的滑动。
# 比如：一个翻动新闻的界面，快速的滑动，就会是扫动的动作，会导致内容 惯性 滚动很多。

# -------------------------按键--------------------------
# 前面的示例代码中已经使用过 调用 press_keycode 方法，就能模拟 按键动作，包括安卓手机的实体按键和 键盘按钮。
# 如下代码所示

# from appium.webdriver.extensions.android.nativekey import AndroidKey
# # 输入回车键，确定搜索
# driver.press_keycode(AndroidKey.ENTER)
# 按键的定义，可以参考这篇文档 https://github.com/appium/python-client/blob/master/appium/webdriver/extensions/android/nativekey.py

# -------------------------长按、双击、移动-------------------------
# Appium的 TouchAction 类提供了更多的手机操作方法，比如：长按、双击、移动
# 参考源代码中的注释 https://github.com/appium/python-client/blob/master/appium/webdriver/common/touch_action.py
# 比如，下面就是一个长按的例子
# from appium.webdriver.common.touch_action import TouchAction
# ...
# actions = TouchAction(driver)
# actions.long_press(element)
# actions.perform()

# ----------------------------查看通知栏---------------------------
# 打开通知栏
# 安卓手机， 查看通知栏的动作可以是从屏幕顶端下滑来查看通知。
# 我们刚刚学过滑动，感兴趣的朋友可以自己试试，关键是要找对滑动的起始点和滑动距离。
# 更方便的，我们可以使用如下代码，直接打开通知栏
# driver.open_notifications()
# 通知栏里面的元素，自动化的方法 和 前面介绍的App界面元素自动化是一样的。
# 收起通知栏
# 收起通知栏，可以使用前面介绍的模拟按键， 发出返回按键的方法。

"""-------------adb 命令
这里我们给大家 介绍一个android sdk里面的命令行工具 adb 。
adb 全程 Android Debug Bridge，这个adb 使用非常广泛。
它可以与 Android 手机设备进行通信，它可进行各种设备操作。
比如： 安装应用和调试应用，传输文件，甚至登录到手机设备上shell的进行访问，就像远程登录一样
这个adb 在 sdk的 platform-tools 目录下面， 请大家确保路径在path环境变量中。
Appium 对anroid的自动化就非常依赖这个adb工具。 执行自动化过程中，有很多内部操作，比如获取设备信息，传送文件到手机，安装apk，启动某些程序等，都是通常这个adb实现的。
大家想想我们学习了adb命令，对我们的自动化程序有什么用例呢？
既然这是个命令，就可以使用 Python的 os.system() 或者 subprocess 来自动化调用它，完成我们的各种自动化需求。
比如，我们自动化过程中，可能需要截屏手机，并且下载到指定目录中，就可以在我们的Python程序中这样写
import os
os.system('adb shell screencap /sdcard/screen3.png && adb pull /sdcard/screen3.png')
特别是，还可以通过adb 使用 am(activity manager) 和pm (package manager) 两个工具， 可以启动 Activity、强行停止进程、广播 intent、修改设备屏幕属性、列出应用、卸载应用等。

大家可以点击这里查看官方文档中介绍的adb命令
下面我们列出了一些场景的adb命令
查看连接的设备
adb devices -l
列出文件和传输文件
查看目录
adb shell ls /sdcard
上传
adb push wv.apk /sdcard/wv.apk
下载
adb pull /sdcard/new.txt
截屏
adb shell screencap /sdcard/screen.png
截屏后的文件存在手机上，可以使用 adb pull 下载下来
shell
登录到手机设备上shell的进行访问，就像远程登录一样，可用来在连接的设备上运行各种命令。
大家可以 执行一下 adb shell 然后执行各种 安卓支持的 Linux命令，比如 ps、netstat、netstat -an|grep 4724、 pwd、 ls 、cd 、rm 等
"""